package main

import "fmt"

/*
m := map[string]string {
	"name": "ccmouse",
	"course": "golang",
	"site": "imooc",
	"quality": "notbad",
}
map[K]V, map[K1]map[K2]V
*/

func main() {
	m := map[string]string{ //hash map  无序的
		"name":    "ccmouse",
		"course":  "golang",
		"site":    "imooc",
		"quality": "notbad",
	}
	m2 := make(map[string]int) // m2 == empty map
	var m3 map[string]int      // m3 ==nil   可以与empty map运算
	fmt.Println(m, m2, m3)
	fmt.Println("Traversing map===============")
	for k, v := range m {
		fmt.Println(k, v) // 也可省略v, 省略k(用_代替)
	}

	fmt.Println("Getting Values===========")
	courseName, ok := m["course"]
	fmt.Println(courseName, ok)
	causeName, ok := m["cause"] // key不存在不会报错, 会打印出zero value
	fmt.Println(causeName, ok)  // todo: 可以根据第二值判断是否存在
	// 一般写法
	if causeName, ok := m["cause"]; ok {
		fmt.Println("causeName = ", causeName)
	} else {
		fmt.Println("key don't not exist")
	}

	fmt.Println("deleting values======")
	name, ok := m["name"]
	fmt.Println(name, ok)
	delete(m, "name")
	name, ok = m["name"]
	fmt.Println(name, ok)
}

/*
todo:
# map的操作
- 创建: make(map[string]int)
- 获取: m[key]
- key不存在时, 获取的值是value类型的初始值
- 用value, ok := m[key] 来判断是否存在key
- 删除: delete(m, key)

# map遍历
- 使用range遍历key, 或者遍历key, value对
- map无序的, 如需顺序需手动对key排序 (slice)
- 使用len获得元素的个数

# map的key
- map使用哈希表, 必须可以比较
- 除了slice, map, function的内建类型都可以作为key
- Struct类型不包含上述字段,也可以作为key
*/
